package cn.cdeden.sys.utils;

import cn.cdeden.sys.domain.dto.FileFormatDto;
import cn.cdeden.sys.domain.dto.SysParametersConfigDto;
import cn.cdeden.sys.enums.SysConfigDefaultEnums;
import cn.cdeden.sys.enums.SysParametersConfigEnums;
import cn.cdeden.sys.service.SysParametersQueryConfigService;
import cn.cdeden.sys.utils.domain.AdDomainConfig;
import cn.cdeden.sys.utils.domain.OAuthConfig;
import cn.cdeden.sys.utils.domain.UserLoginInfo;
import cn.cdeden.sys.utils.domain.WeChatConfig;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
//import com.cdyd.ecm.sys.domain.dto.FileFormatDto;
//import com.cdyd.ecm.sys.domain.dto.SysParametersConfigDto;
//import com.cdyd.ecm.sys.enums.SysConfigDefaultEnums;
//import com.cdyd.ecm.sys.enums.SysParametersConfigEnums;
//import com.cdyd.ecm.sys.service.SysParametersQueryConfigService;
//import com.cdyd.ecm.sys.utils.domain.AdDomainConfig;
//import com.cdyd.ecm.sys.utils.domain.OAuthConfig;
//import com.cdyd.ecm.sys.utils.domain.UserLoginInfo;
//import com.cdyd.ecm.sys.utils.domain.WeChatConfig;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.coyote.BadRequestException;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @ProjectName : ecm_hou
 * @Package : com.cdyd.ecm.core.sys.utils
 * @ClassName : SysConfigUtils
 * @Author : Yu.
 * @Description : // TODO
 * @Date : 2023/2/15 16:41
 * @Version : 1.0
 */
@RequiredArgsConstructor
@Component
@Slf4j
public class SysConfigUtils {

//    private final SysParametersConfigService configService;
    private final SysParametersQueryConfigService configService;


    /**
     * 根据配置代码和枚举类型获取系统参数配置信息。
     *
     * @param configCode 配置代码，对应于系统配置的唯一标识。
     * @param enums 枚举类型，用于指定需要获取的配置的具体类型。
     * @return 返回一个SysParametersConfigDto对象，包含指定配置代码和枚举类型对应的配置信息。
     */
    public SysParametersConfigDto getByConfigCodeAfter(SysConfigDefaultEnums configCode, SysParametersConfigEnums enums) throws BadRequestException {
        // 通过配置代码和枚举类型获取配置信息
        SysParametersConfigDto byCode = getByConfigCodeAfter(configCode.getConfigCode(), enums);
        return byCode;
    }






    /**
     * 根据配置代码和枚举类型获取系统参数配置信息。
     *
     * @param configCode 配置代码，对应于系统配置的唯一标识。
     * @param enums 枚举类型，用于指定需要获取的配置的具体类型。
     * @return 返回一个SysParametersConfigDto对象，包含指定配置代码和枚举类型对应的配置信息。
     */
    public SysParametersConfigDto getByConfigCodeAfter(String configCode, SysParametersConfigEnums enums) throws BadRequestException {
        SysParametersConfigDto byCode = getByConfigCodeAfter(configCode, enums, false);
        return byCode;
    }

    public SysParametersConfigDto getByConfigCodeAfter(String configCode, SysParametersConfigEnums enums,boolean mandatory) throws BadRequestException {
        SysParametersConfigDto byCode = configService.getByCode(configCode, enums.getCode(),mandatory);
        return byCode;
    }





    /**
     * 根据配置代码和枚举类型获取参数配置列表。
     *
     * @param configCode 配置代码，用于筛选参数配置。
     * @param enums 枚举类型，进一步筛选参数配置。
     * @return 返回匹配给定配置代码和枚举类型的参数配置列表。
     */
    public List<SysParametersConfigDto> getByConfigCodeAfters(String configCode, SysParametersConfigEnums enums) throws BadRequestException {
        // 通过配置代码和枚举类型从配置服务获取参数配置列表
        List<SysParametersConfigDto> byCodes = configService.getByCodes(configCode, enums);
        return byCodes;
    }


    /**
     * @param
     * @return long
     * @author Yu.
     * @Description // 获取限制上传文件大小
     * @Date 2023/5/31 15:23
     **/
    public long getFileSize() {
        long _size = 500L;
        try {
            SysParametersConfigDto byConfigCodeAfter = this.getByConfigCodeAfter(SysConfigDefaultEnums.fileSizeLimit.getConfigCode(), SysParametersConfigEnums.SYS_FILE_CONFIG);
            String configValue = byConfigCodeAfter.getConfigValue();
            _size = Long.parseLong(configValue);
        } catch (Exception e) {
        }
        return 1024 * 1024 * _size;  // 500M大小  上限Limit
    }

    public boolean getFileSize(long size) {
        long _size = 500L;
        try {
            SysParametersConfigDto byConfigCodeAfter = this.getByConfigCodeAfter(SysConfigDefaultEnums.fileSizeLimit.getConfigCode(), SysParametersConfigEnums.SYS_FILE_CONFIG);
            String configValue = byConfigCodeAfter.getConfigValue();
            _size = Long.parseLong(configValue);
        } catch (Exception e) {
        }
        if (size == -1) {
            return false;
        }
        return 1024 * 1024 * _size < size;  // 500M大小  上限Limit
    }


    /**
     * @param fileType
     * @return boolean
     * @author Yu.
     * @Description // 限制上传文件的格式
     * @Date 2023/6/1 13:50
     **/
    public boolean getFileFormat(String fileType) {
        boolean b = true;
        try {
            SysParametersConfigDto byConfigCodeAfter = this.getByConfigCodeAfter(SysConfigDefaultEnums.fileFormat.getConfigCode(), SysParametersConfigEnums.SYS_FILE_CONFIG);
            String configValue = byConfigCodeAfter.getConfigValue();
            JSONObject jsonObject = JSONObject.parseObject(configValue);
            if (jsonObject.containsKey("state")) { //判断整个模块是否需要验证文件
                Boolean objectBoolean = jsonObject.getBoolean("state");
                if (!objectBoolean) {
                    return true;
                }
            }
            List<String> list = new ArrayList<>();
            JSONArray data = jsonObject.getJSONArray("data");
            for (int i = 0; i < data.size(); i++) {
                JSONObject object = data.getJSONObject(i);
                Boolean state = object.getBoolean("state");
                if (state) { // 判断这个模块是否加入数据
                    JSONArray jsonArray = object.getJSONArray("data");
                    List<String> list1 = jsonArray.toJavaList(String.class);
                    list.addAll(list1);
                }
            }
            b = list.contains(fileType);
        } catch (Exception e) {
        }
        return b;
    }

    /**
     * @author Yu.
     * @Description // 获取文件格式配置
     * @Date 2024/8/13 10:32
     * @param
     * @return com.cdyd.ecm.sys.domain.dto.FileFormatDto
     **/
    public FileFormatDto getFileFormatDto() {
        FileFormatDto fileFormatDto = new FileFormatDto();
        try {
            SysParametersConfigDto byConfigCodeAfter = this.getByConfigCodeAfter(SysConfigDefaultEnums.fileFormat.getConfigCode(), SysParametersConfigEnums.SYS_FILE_CONFIG);
            String configValue = byConfigCodeAfter.getConfigValue();
            fileFormatDto = JSONObject.parseObject(configValue, FileFormatDto.class);

        } catch (Exception e) {
        }
        return fileFormatDto;
    }


    /**
     * 获取用户登录信息配置。
     * 该方法不接受任何参数，返回一个包含用户登录方式信息的UserLoginInfo对象。
     *
     * @return com.cdyd.ecm.core.sys.domain.config.UserLoginInfo 包含用户登录方式信息的对象。
     **/
    public UserLoginInfo getUserLoginInfo() {
        UserLoginInfo userLoginInfo = new UserLoginInfo();
        try {
            // 通过配置代码和类型获取登录方式配置信息
            SysParametersConfigDto codeAfter = getByConfigCodeAfter(SysConfigDefaultEnums.LoginWay.getConfigCode(), SysParametersConfigEnums.SYS_LOGIN_CONFIG);
            // 解析配置信息的值
            String configValue = codeAfter.getConfigValue();
            // 将配置值转换为数组
            List<String> javaList = JSONArray.parseArray(configValue, String.class);
            userLoginInfo = new UserLoginInfo(javaList);
        }catch (Exception e){
            log.info("通过配置代码和类型获取登录方式配置信息失败",e);
        }

        return userLoginInfo;
    }




    /**
     * @author Yu.
     * @Description // 获取企业微信配置信息
     * @Date 2024/4/23 11:16
     * @param
     * @return com.cdyd.ecm.sys.utils.domain.WeChatConfig
     **/
    public WeChatConfig getWeChatConfigInfo() {
        String code = "wx_login_status,wx_corpsecret,wx_agentid,wx_corpid";
        try {
            List<SysParametersConfigDto> infoList = getByConfigCodeAfters(code, SysParametersConfigEnums.SYS_INTEGRATION_CONFIG);
            WeChatConfig weChatConfig = new WeChatConfig(infoList);
            return weChatConfig;
        }catch (Exception e){
            throw new RuntimeException("无法获取企业微信配置信息");
        }
    }





    /**
     * @author Yu.
     * @Description // 获取ad域配置信息
     * @Date 2024/4/23 11:17
     * @param
     * @return com.cdyd.ecm.sys.utils.domain.WeChatConfig
     **/
    public AdDomainConfig getADDomainConfigInfo(){
        String code = "ad_domain_status,ad_domain_start,ad_domain_url,ad_domain_userDn,ad_domain_password,ad_domain_domainName,ad_domain_domainPerfix,ad_domain_ou";

        try {
            List<SysParametersConfigDto> infoList = getByConfigCodeAfters(code, SysParametersConfigEnums.SYS_INTEGRATION_CONFIG);
            AdDomainConfig config = new AdDomainConfig(infoList);
            return config;
        }catch (Exception e){
            throw new RuntimeException("无法获取ad域配置信息");
        }
    }


    /**
     * @author Yu.
     * @Description // 获取OAuth配置信息
     * @Date 2024/5/21 18:34
     * @param
     * @return com.cdyd.ecm.sys.utils.domain.OAuthConfig
     **/
    public OAuthConfig getOAuthStatusConfigInfo() {
        String code = "OAuth_url,OAuth_enable,OAuth_redirectUri,OAuth_clientId,OAuth_grantType,OAuth_clientSecret";
        try {
            List<SysParametersConfigDto> infoList = getByConfigCodeAfters(code, SysParametersConfigEnums.SYS_INTEGRATION_CONFIG);
            OAuthConfig config = new OAuthConfig(infoList);
            return config;
        }catch (Exception e){
            throw new RuntimeException("无法获取OAuth配置信息");
        }
    }

    /**
     * @author Yu.
     * @Description // 查询是否有开启的情况
     * @Date 2024/5/21 18:38
     * @param configCode
     * @return java.lang.Boolean
     **/
    public SysParametersConfigDto getIntegrationOpen(SysConfigDefaultEnums configCode) {
        String code = "OAuth_enable,ad_domain_status,wx_login_status";
        try {
            List<SysParametersConfigDto> infoList = getByConfigCodeAfters(code, SysParametersConfigEnums.SYS_INTEGRATION_CONFIG);

            List<SysParametersConfigDto> collect = infoList.stream().filter(item -> !item.getConfigCode().equals(configCode.getConfigCode())).collect(Collectors.toList());
            for (SysParametersConfigDto configDto : collect) {
                if (configDto.getConfigValue().equals("true")) {
                    return configDto;
                }
            }
            return null;
        }catch (Exception e){
            throw new RuntimeException("无法获取OAuth配置信息");
        }


    }




}
